// Package utils
// @Author zhongxc
// @Date 2024/7/5 17:50:00
// @Desc
package utils

import (
	"crypto/md5"
	"encoding/base64"
	"encoding/hex"
	"encoding/json"
	"reflect"
	"strconv"
)

// StructToMap
// @Description: 将任意结构体转换为 map[string]interface{}
// @param v
// @return map[string]interface{}
// @return error
func StructToMap(v interface{}) (map[string]interface{}, error) {
	// 将结构体转换为 JSON 字节流
	data, err := json.Marshal(v)
	if err != nil {
		return nil, err
	}

	// 创建一个空的 map[string]interface{}
	var m map[string]interface{}

	// 将 JSON 字节流反序列化为 map
	err = json.Unmarshal(data, &m)
	if err != nil {
		return nil, err
	}

	// 使用反射检查和转换类型
	vType := reflect.TypeOf(v)
	vValue := reflect.ValueOf(v)
	for i := 0; i < vType.NumField(); i++ {
		fieldName := vType.Field(i).Tag.Get("json")
		if fieldName != "" {
			fieldValue := vValue.Field(i).Interface()
			if fieldValue != nil {
				m[fieldName] = fieldValue
			}
		}
	}

	return m, nil
}

// StringSliceToIntSlice
// @Description: 将字符串切片转换为整数切片
// @param strSlice
// @return []int
// @return error
func StringSliceToIntSlice(strSlice []string) ([]int64, error) {
	intSlice := make([]int64, len(strSlice))
	for i, str := range strSlice {
		// integer, err := strconv.Atoi(str)
		integer, err := strconv.ParseInt(str, 10, 64)
		if err != nil {
			return nil, err
		}
		intSlice[i] = integer
	}
	return intSlice, nil
}

// MD5
// @Description: Md5
// @param str
// @return string
func MD5(str string) string {
	md5Ctx := md5.New()
	md5Ctx.Write([]byte(str))
	return hex.EncodeToString(md5Ctx.Sum(nil))
}

// Base64Md5
// @Description: 先Base64，再MD5
// @param str
// @return string
func Base64Md5(str string) string {
	return MD5(base64.StdEncoding.EncodeToString([]byte(str)))
}
